- akekolvek otazky resp. hotove zapoctaky posielajte na marcincak@vsl.sk
- v ulohach 1,2,3,4 vytvorte okrem pozadovanej triedy aj samostatnu triedu Tester,
  ktora bude mat metodu main, v ktorej vyskusate pozadovanu triedu
- v ulohach 3,4 predpokladajte, ze uz je definovana trieda 
  public class MyFileRader {
    public MyFileReader(String filename);
    public String nextLine();
    public String lastError();
  }
  
  // velmi primitivny 'citac' obsahu text.suboru. po skonstruovani je mozne 
  // opakovanym volanim nextLine citat po riadkoch obsah suboru (az kym nextLine nevrati null)
  // ak by niekde doslo k chybe (napr. pri otvarani suboru) metoda lastError() 
  // vrati not null string s popisom chyby (trosku hlupe, ale kedze ste este nemali exceptions, tak neviem co ine :)
  

===================================================
1. MyStringTokenizer
 - trieda umoznujuca tokenizaciu (rozbijanie) stringu podla zadaneho delimitera.
 - pr. string "ahoj|fero||kde|ides|" je pomocou delimitera "|" mozne rozbit na 6 resp. 4 substringy
   ("ahoj","fero",null,"kde","ides",null) resp. ("ahoj","fero","kde","ides") podla toho, ci
   ignorujeme null tokeny alebo nie.
 - minimalne pozadovane API
    konstruktor(String s, String delim) - vytvori tokenizer nad danym stringom 's' s pozadovanym delimiterom 'delim'. null tokeny sa nebudu ignorovat
    konstruktor(String s, String delim, Boolean skipEmpty) - analogicky, akurat je mozne specifikovat, ci sa null tokeny budu ignorovat alebo nie
    boolean hasMoreTokens() - vrati true/false podla toho, ci este su nejake neprecitane tokeny
    String nextToken() - vrati dalsi token resp. null ak uz ziadne nie su. opakovane vyvolavanie tejto metody musi davat vzdy dalsie a dalsie tokeny
    void reset() - nastavi tokenizer 'na zaciatok' - t.j. ako keby ani raz nebola zavolana nextToken
    
===================================================
2. MyStringBuffer
 - trieda reprezentujuca modifikovatelny string (vid cvicenie)
 - interne bude mat data ulozene ako pole char-ov ak niektora operacia by sposobila preplnenie
   pola, je potrebne toto pole realokovat
 - minimalne pozadovane API
    konstruktor(String s) - vytvori MSB rovno s naplnenou hodnotou
    konstruktor(int capac) - vytvori prazdny MSB s minimalnou udanou kapacitou (ak sa don neprida viac ako 'capac' znakov, nebude sa musiet realokovat)
    konstruktor() - prazdny s default kapacitou 10 znakov
    String toString() - no comment
    charAt(int pos) - 'pos'-ty znak (cislovat od 0)
    append(String s) - pridanie retazca 's' na koniec buffra
    prepend(String s) - .. na zaciatok
    insert(int pos, String s) - vlozenie na zadanu poziciu
    remove(int startpos, int len) - vysekne 'len' znakov od pozicie 'startPos' vratane
    replace(String s1, String s2) - nahradi vsetky vyskyty retazca s1 retazcom s2
    int length() - dlzka aktualne vlozeneho retazca
    int getCapac() - aktualne alokovana velkost buffra
    void ensureCapac(int capac) - zabezpeci, ze minimalne 'capac' znakov bude alokovanych (ak aktualny capac je viac, necha tak, ak menej zvacsi)
    trim() - oseka zlava aj sprava whitespaces(medzery, tab)
    encode()
    decode() - vykona zasifrovanie/odsifrovanie ulozeneho retazca podla vami zvoleneho algoritmu


===================================================
3. MyProperties 
  - trieda spristupnujuca properties ulozene v textovom subore 
  - ukazka formatu suboru:
  
[DATABASE]
DBNAME     = PPKLIENTI
DBUSER     = dbadmin
DBPASSWD   = heslo
STOREDPROC = false
LOGFILE    = servers\log\dbaccess.log
LOGEXECTIME = 1

[KOMUNIKACIA S SCP]
IMPORT/EXPORT_ROOT = SCP
TEMPLATE_DIR       = conf

[KOMUNIKACIA S BANKOU]
IMPORT/EXPORT_ROOT     = Potov banka
TEMPLATE_IMPORTU_BV    = conf\bankovy vypis.xml
TEMPLATE_IMPORTU_VAKUP = conf\vakup.xml
TEMPLATE_EXPORTU_PP    = conf\prevodny prikaz.xml

  - ignorovat prazdne riadky (tie co obsahuju iba whitespaces (w))
  - ignorovat aj vsetky ostatne riadky, 
    co nie su w*[<section>]w* resp. <propname>w*=w*<propvalue>w*
  - minimalne pozadovane API:
    konstruktor()
    load(filename) - nanovo (replace) naplni properties z file-u
    String getProperty(String section, String name, String default) - vrati stringovu property 
                  s menom 'name' nachadzajucu sa v sekcii 'section'. ak taka nie je, vrati default hodnotu
    int getProperty(String section, String name, int default)
    boolean getProperty(String section, String name, boolean default)
       - analogicky ako strigova verzia, akurat sa vykona aj automaticka konverzia 
         na pozadovany typ. ak property neexistuje, alebo konverzia nie je mozna, vrati default
         pri boolean podporit format true/false aj 1/0


===================================================
4. MyXMLFile a MyXMLTag
  - dvojica tried umoznujuca nacitanie zjednodusneho XML suboru
  - ukazka formatu suboru:

<template name="PP" desc="Prevodny prikaz Postovej banky"> 

	<options>
		<opt name="codepage" value="ISOLatin2"/>
	</options>

	<header>
		<line len="34">
			<col name="typVetyHeader" 		start="1"  	value="00"/>
			<col name="porCislo" 					start="3" 	value="000001"/>
			<col name="datVytvorenia" 		start="9" 	len="6" 				type="Date"/>
			<col name="skratNazovKlienta" start="15"	value="PP                  "/>
		</line>
	</header>

	<row>
		<line len="133">
			<col name="typPolozky" 				start="1" 	value="11"/>	
			<col name="datumSplatnosti" 	start="3" 	len="6" 				type="Date"/>
			<col name="porCisDokladu" 		start="9" 	len="8" 				type="Long" 		fillChar="0"/>
			<col name="predcislieUctuOdosielatela" 	start="17"  len="6" 	fillChar="0" align="right"/>
			<col name="ucetOdosielatela" 	start="23"  len="10" 	fillChar="0" align="right"/>
			<col name="predcislieUctuPrijemcu" 	start="33"  len="6" 	fillChar="0" align="right"/>
			<col name="ucetPrijemcu" 	start="39"  len="10" 	fillChar="0" align="right"/>
			<col name="kodBankyPrijemcu" 	start="49" 	len="7"/>
			<col name="suma" 							start="56" 	len="15"/>
			<col name="mena" 							start="71" 	value="SKK"/>
			<col name="SPSYcredit" 				start="74"  len="10"/>
			<col name="SPSYdebet" 				start="84"  value="0000000000"/>
			<col name="VASY" 							start="94"  len="10"/>
			<col name="KOSY" 							start="104" len="10"/>
			<col name="poznamka" 					start="114" len="20"/>
		</line>
	</row>

	<footer>
		<line len="27">
			<col name="typVetyFooter" 		start="1" 	value="51"/>
			<col name="pocetPoloziek" 		start="3"  	len="5" 				type="Long"/>
			<col name="sumaSpolu" 				start="8"  	len="20" 				type="Decimal"/>
		</line>
	</footer>

</template>  

  - zjednodusenie zahrna:
    - len jeden tag na jednom riadku
    - tagname ide hned za <
    - atributy tagu su vzdy vo formate <name>="<value>" (teda ziadne medzery pred ani za =)
  - minimalne pozadovane API:
    class MyXMLFile {
      konstruktor()
      String load(String filename) - nacita XML file a vybuduje strom tagov (DOM) 
                                     ak pri parsingu dojde k chybe varti popis chyby inak null
                                     (trosku hlupe osetovanie chyb, ale co uz, ked ste nemali exceptions)
      MyXMLTag getRoot() - vrati korenovy element
    }
    
    class MyXMLTag {
      String getName() - vrati meno tagu
      String getAttribute(String attname) - vrati hodnotu atributu. ak taky nie je vrati null
      MyXMLTag getSubtag(String tagname) - vrati referenciu na (prvy) subtag s danym menom
      MyXMLTag[] getSubtags(String tagname) - vrati pole vsetkych subtagov s danym menom
    }

===================================================
5. Piskvorky
 - piskvorky pre dvoch hracov, ktori striedavo zadavaju svoj tah.
 - vystup na konzolu (System.out) vstup podobne (System.in)
 - pocitac musi zistit, ze hra skoncila, resp. nie je mozne urobit ziaden tah
 - na zaciatku je mozne zvojit velkost hracej plochy (max. zvolte tak, 
   aby sa to voslo na konzolu 80x25)
 - analogicky mozte spravit sachy pre dvoch, reversi a pod.
   
===================================================
6. Piskvorky
 - piskvorky 3x3 pre jedneho hraca a pocitac, ktory bude 'aspon trosku inteligentny'